NumPy 패키지의 난수 관련 명령어

numpy.random 서브패키지

numpy.random 서브패키지는 NumPy 의 랜덤 넘버 생성 관련 함수를 모아 놓은 것으로 다음과 같은 함수를 제공한다.

  • seed: pseudo random 상태 설정
  • shuffle: 조합(combination)
  • choice: 순열(permutation)
  • random_integers: uniform integer
  • rand: uniform
  • randn: Gaussina normal

컴퓨터에서 생성한 난수는 랜덤처럼 보이지만 정해진 알고리즘에 의해 생성되는 규칙적인 순열이다. seed 명령은 이러한 순열을 시작하는 초기값을 설정하여 난수가 정해전 순서로 나오게 만든다.


In [2]:
np.random.seed(0)

shuffle 명령은 주어진 배열의 순서를 뒤섞는다.


In [3]:
x = np.arange(10)
np.random.shuffle(x)
x


Out[3]:
array([2, 8, 4, 9, 1, 6, 7, 3, 0, 5])

choice 명령은 단순히 순서를 바꾸는 것이 아니라 size 인수로 정해진 갯수만큼 원소를 골라내는 역할을 한다. 이 때 replace 인수를 True로 설정하여 한 번 골랐던 원소를 다시 고를 수 있도록 할 수 있다. 또한 p 인수를 이용하여 각 원소가 선택될 확률도 설정할 수 있다.


In [5]:
np.random.choice(5, 5, replace=True)  # same as shuffle


Out[5]:
array([0, 4, 2, 1, 0])

In [6]:
np.random.choice(5, 3, replace=False)


Out[6]:
array([0, 2, 3])

In [7]:
np.random.choice(5, 10)   #default 값은 True구만


Out[7]:
array([0, 1, 4, 3, 0, 3, 0, 2, 3, 0])

In [8]:
np.random.choice(5, 10, p=[0.1, 0, 0.3, 0.6, 0])


Out[8]:
array([3, 3, 3, 3, 3, 3, 3, 2, 3, 2], dtype=int64)

random_integers 명령은 주어진 범위 사이의 정수를 랜덤하게 생성한다.


In [9]:
x = np.random.random_integers(-100, 100, 50)
sns.distplot(x, rug=True);


C:\Anaconda3\lib\site-packages\ipykernel\__main__.py:1: DeprecationWarning: This function is deprecated. Please call randint(-100, 100 + 1) instead
  if __name__ == '__main__':
C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

rand 명령은 0과 1사이의 값을 균일하게 생성한다.


In [10]:
x = np.random.rand(10000)
sns.distplot(x);


C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

randn 명령은 표준 정규 분포 값을 균일하게 생성한다.


In [11]:
x = np.random.randn(1000)
sns.distplot(x);


C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

NumPy의 카운트 함수

NumPy는 생성된 난수의 통계 정보를 구하는 카운트(count)함수들도 제공한다.

정수가 각각 몇개씩 생성되었는지 알고 싶은 경우에느 unique 명령이나 bincount 명령을 사용한다. unique 명령은 연속적인 정수를 가정하지 않고 있지만 bincount 명령은 0 부터 시작한 연속적인 정수를 가정하고 있어서 혹시 전혀 생성되지 않는 정수도 감안할 수 있다.

실제로는 bincount를 더 많이 쓴다.


In [12]:
np.unique([11, 11, 2, 2, 34, 34])


Out[12]:
array([ 2, 11, 34])

In [14]:
a = np.array([[1, 1], [2, 3]])
a


Out[14]:
array([[1, 1],
       [2, 3]])

In [15]:
a = np.array(['a', 'b', 'c', 'b', 'a'])
index, count = np.unique(a, return_counts=True)

In [16]:
index


Out[16]:
array(['a', 'b', 'c'], 
      dtype='<U1')

In [17]:
count


Out[17]:
array([2, 2, 1], dtype=int64)

In [18]:
np.bincount([1, 1, 2, 2, 3, 3, 4, 6, 6], minlength=6)


Out[18]:
array([0, 2, 2, 2, 1, 0, 2], dtype=int64)